import { app, BrowserWindow, ipcMain } from 'electron';
import log from 'electron-log/main';

export const setupAppLifecycle = (
  mainWindow: BrowserWindow | null,
  createWindow: () => void,
) => {
  // 跟踪窗口引用而不修改参数
  let win = mainWindow;

  // 当所有窗口关闭时，退出应用程序（除非在 macOS 上）
  app.on('window-all-closed', () => {
    log.info('所有窗口已关闭');
    win = null;
    if (process.platform !== 'darwin') app.quit(); // 在非 macOS 平台上退出应用程序
  });

  // 当应用程序被激活时，如果没有窗口则创建一个新窗口
  app.on('activate', () => {
    const allWindows = BrowserWindow.getAllWindows();
    if (allWindows.length) {
      allWindows[0].focus(); // 聚焦到现有窗口
    } else {
      log.info('没有窗口，创建一个新窗口');
      createWindow(); // 创建一个新窗口
    }
  });

  // 当应用程序已存在的实例被激活时，聚焦到主窗口
  app.on('second-instance', () => {
    if (win) {
      // 使用安全检查
      try {
        if (win.isMinimized()) win.restore(); // 如果窗口最小化，则恢复窗口
        win.focus(); // 聚焦到主窗口
      } catch (error) {
        log.error('无法聚焦窗口:', error);
      }
    }
  });

  // 注册窗口控制事件处理函数
  const minimizeHandler = () => {
    try {
      if (win && !win.isDestroyed()) win.minimize();
    } catch (error) {
      log.error('无法最小化窗口:', error);
    }
  };

  const maximizeHandler = () => {
    try {
      if (win && !win.isDestroyed()) {
        if (win.isMaximized()) {
          win.unmaximize(); // 如果已经最大化，则还原
        } else {
          win.maximize();
        }
      }
    } catch (error) {
      log.error('无法最大化/还原窗口:', error);
    }
  };

  const closeHandler = () => {
    try {
      if (win && !win.isDestroyed()) win.close();
    } catch (error) {
      log.error('无法关闭窗口:', error);
    }
  };

  // 监听窗口控制事件
  ipcMain.on('window:minimize', minimizeHandler);
  ipcMain.on('window:maximize', maximizeHandler);
  ipcMain.on('window:close', closeHandler);

  // 返回清理函数
  return () => {
    // 移除所有事件监听器
    ipcMain.removeListener('window:minimize', minimizeHandler);
    ipcMain.removeListener('window:maximize', maximizeHandler);
    ipcMain.removeListener('window:close', closeHandler);
    win = null;
    log.info('应用生命周期事件监听器已清理');
  };
};
